<?php
 /**
 * Fonctions de gestion de admission post bac
 * @package Garennes
 * @author Jean-Francois Campan <jean-francois.campan@ac-poitiers.fr>
 * @version 0.5
 */

 /**
 * Definition du nom du logiciel pour transmission XML
 * @global string APB_NOM_LOGICIEL
 */
 Define ("APB_NOM_LOGICIEL", "garennes") ;

 /**
 * Definition de la version de la bibliotheque APB
 * @global string APB_VERSION
 */
 Define ("APB_VERSION", $version_garennes) ;

 /**
 * Version XML a utiliser
 * @global string APB_VERSION_XML
 */
 Define ("APB_VERSION_XML", "1.0") ;

 /**
 * Jeu de caracteres a utiliser dans le fihcier XML final
 * @global string APB_ENCODAGE_XML
 */
 Define ("APB_ENCODAGE_XML", "iso-8859-1") ;

 /**
 * Nombre d'annees maximum de prise en compte des annees scolaires
 * @global int APB_NOMBRE_ANNEE_MAX
 */
 Define ("APB_NOMBRE_ANNEE_MAX", 6) ; // Nombre d'annees maximum

 /**
 * Definition de constantes pour les entetes des codes uniques
 * @global char APB_ENTETE_CLASSE
 * @global char APB_ENTETE_PROF
 * @global char APB_ENTETE_MATIERE
 * @global char APB_ENTETE_LANGUE
 * @global char APB_ENTETE_SERVICE_NOTATION
 * @global char APB_ENTETE_ELEVE
 */
 Define ("APB_ENTETE_CLASSE", "C") ;
 Define ("APB_ENTETE_PROF", "P") ;
 Define ("APB_ENTETE_MATIERE", "M") ;
 Define ("APB_ENTETE_LANGUE", "L") ;
 Define ("APB_ENTETE_SERVICE_NOTATION", "S") ;
 Define ("APB_ENTETE_ELEVE", "E") ;

 /**
 * Definition de l'arrondi des notes : 1 chiffre apres la virgule
 * @global int APB_MODE_ARRONDI_NOTE
 */
 Define ("APB_MODE_ARRONDI_NOTE", 1) ;

 /**
 * Definition des classes a exporter (separation : | ) : classe1|classe2|...
 * @global string APB_CLASSES_EXPORT
 */
 Define ("APB_CLASSES_EXPORT", "terminale") ;

 /**
 * Definition des niveaux de classes a exporter (separation : | ) : niveau1|niveau2|...
 * @global string APB_NIVEAUX_EXPORT
 */
 Define ("APB_NIVEAUX_EXPORT", "premiere|terminale") ;

 /**
 * Definition de l'attribut modalite d'election pour MOYGEN
 * @global char APB_MODALITE_MOYGEN
 */
 Define ("APB_MODALITE_MOYGEN", "S") ;

 /**
 * Definition de l'attribut indetermination pour la modalite d'election inconnue dans notes
 * @global char APB_MODALITE_INCONNUE
 */
 Define ("APB_MODALITE_INCONNUE", "I") ;

 /**
 * Renvoie si APB est actif sur au moins un etablissement
 * @return int 1:Actif globalement, 0:Non actif globalement
 */
 Function garennes_apb_actif ($millesime)
  {
   Global $id_sql ;
   $etabl = SQL_commande ("SELECT id_etablissement FROM etablissements WHERE millesime='".$millesime."'", $id_sql) ;
   $apb_actif = 0 ;
   $nbr = SQL_nbr_lignes ($etabl) ;
   $i = 0 ;
   While (($apb_actif == 0) And ($i < $nbr))
    {
     $ligne = SQL_ligne_suivante ($etabl) ;
     $activation_apb = restaure_configuration_defaut ("ADMISSION_POST_BAC","ETAB_".$ligne [0], "ACTIVATION", 0) ;
     If ($activation_apb == 1) { $apb_actif = 1 ; }
     $i++ ;
    }
   Return $apb_actif ;
  }

 /**
 * Renvoie si APB est actif sur un etablissement particulier
 * @param int $id_etablissement Identifiant de l'etablissement
 * @return int 1:Actif globalement, 0:Non actif globalement
 */
 Function garennes_apb_etablissement_actif ($id_etablissement)
  {
   Global $id_sql ;
   $apb_actif = restaure_configuration_defaut ("ADMISSION_POST_BAC","ETAB_".$id_etablissement, "ACTIVATION", 0) ;
   Return $apb_actif ;
  }

 /**
 * Conversion d'une chaine de caracteres dans le bon jeu avec encodage des caracteres speciaux
 * @param string $chaine Chaine a convertir
 * @return string Chaine convertie
 */
 Function conversion_texte ($chaine)
  {
   Return HtmlSpecialChars ($chaine, ENT_QUOTES, APB_ENCODAGE_XML) ;
  }

 /**
 * Retourne la modalite d'une discipline (modalite)
 * @param string $code_mef Code du MEF
 * @param string $code_matiere Code de la disicpline
 * @return string Etat (S,O,F,N)
 */
 Function garennes_apb_modalite_discipline ($code_mef, $code_matiere)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT modalite FROM modalites WHERE code_mef='".$code_mef."' AND code_matiere='".$code_matiere."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { $etat = SQL_ligne_suivante ($resultats) ; }
   Else
    {
     $resultats = SQL_commande ("SELECT modalite FROM modalites WHERE code_matiere='".$code_matiere."' LIMIT 1", $id_sql) ;
     If (SQL_nbr_lignes ($resultats) == 1) { $etat = SQL_ligne_suivante ($resultats) ; }
     Else
      {
       // On recherche sur la configuration manuelle
       $etat [0] = "S" ;
      }
    }
   Return $etat [0] ;
  }

 /**
 * Retourne si le code sconet d'une discipline existe
 * @param string $code_matiere Code sconet de la discipline
 * @return boolean Indique si le code matiere existe
 */
 Function garennes_apb_code_modalite_existe ($code_matiere)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT id_modalite FROM modalites WHERE code_matiere='".$code_matiere."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { Return True ; }
   Return False ;
  }

 /**
 * Retourne si le code gestion d'une discipline existe
 * @param string $code_gestion Code de gestion de la discipline
 * @return boolean Indique si le code de gestion existe
 */
 Function garennes_apb_nom_bref_existe ($code_gestion)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT id_modalite FROM modalites WHERE code_gestion='".$code_gestion."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { Return True ; }
   Return False ;
  }

 /**
 * Retourne si la discipline sconet existe
 * @param string $code_matiere Code sconet de la discipline
 * @param string $code_gestion Code de gestion de la discipline
 * @return boolean Indique si la discipline existe
 */
 Function garennes_apb_discipline_sconet_existe ($code_matiere,$code_gestion)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT id_modalite FROM modalites WHERE code_matiere='".$code_matiere."' AND code_gestion='".$code_gestion."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultats) == 1) { Return True ; }
   Return False ;
  }

 /**
 * Retourne si la discipline sconet possede un bon code et applicable sur un MEF
 * @param string $code_matiere Code sconet de la discipline
 * @param string $code_gestion Code de gestion de la discipline
 * @return array [0]=Nombre;[i]=Code mef si existe sinon false
 */
 Function garennes_apb_code_mef_discipline_sconet ($code_matiere,$code_gestion)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT code_mef FROM modalites WHERE code_matiere='".$code_matiere."' AND code_gestion='".$code_gestion."'", $id_sql) ;
   $table [0] = SQL_nbr_lignes ($resultats) ;
   If ($table [0] > 0)
    {
     For ($i = 1 ; $i <= $table [0] ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       $table [$i] = $ligne [0] ;
      }
     Return $table ;
    }
   Return False ;
  }

 /**
 * Retourne les caracteristiques de la discipline en fonction de l'identification de la modalite
 * @param string $id_modalite Identifiant de la modalite
 * @return array [0]=id_modalite;[1]=code_mef;[2]=code_matiere;[3]=code_gestion;[4]=libelle_long;
 *               [5]=libelle_court;[6]=libelle_edition;[7]=modalite;[8]=horaire
 *               sinon false
 */
 Function garennes_apb_caracteristiques_modalite ($id_modalite)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_modalite,code_mef,code_matiere,code_gestion,libelle_long,libelle_court,libelle_edition,modalite,horaire FROM modalites WHERE id_modalite='".$id_modalite."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return $ligne ;
    }
   Return False ;
  }

 /**
 * Retourne un tableau de modalites pour codes/libelles sconet
 * @param string $code_sconet Code sconet de la discipline
 * @param string $libelle_sconet Libelle sconet
 * @return array [0]=identifiant;[1]=code_sconet;[2]=libelle_sconet;[3]=libelle
 * @return boolean false si aucun resultat
 */
 Function garennes_apb_modalites ($code_sconet, $libelle_sconet)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_modalite,code_matiere,code_gestion,libelle_long FROM modalites WHERE code_matiere='".$code_sconet."' AND code_gestion='".$libelle_sconet."' ORDER BY id_modalite LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1)
    {
     $ligne = SQL_ligne_suivante ($resultat) ;
     Return Array ($ligne [0], $ligne [1], $ligne [2], $ligne [3]) ;
    }
   Return False ;
  }

 /**
 * Retourne un tableau de toutes les disicplines pour un MEF particulier
 * @param string $mef Code mef
 * @return array [0][0]=Nbr;[i][0]=id_modalite;[i][1]=Code mef;[i][2]=mef;[i][3]=code matiere;[i][4]=code gestion;[i][5]=libelle_long
 *               [i][6]=libelle court;[i][7]=libelle edition;[i][8]=modalite;[i][9]=horaire
 */
 Function garennes_apb_liste_disciplines_par_mef ($mef)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_modalite,code_mef,code_matiere,code_gestion,libelle_long,libelle_court,libelle_edition,modalite,horaire FROM modalites WHERE code_mef='".$mef."' ORDER BY libelle_long,libelle_court,libelle_edition", $id_sql) ;
   $table [0][0] = SQL_nbr_lignes ($resultat) ;
   If ($table [0][0] > 0)
    {
     For ($i = 1 ; $i <= $table [0][0] ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       For ($j = 0 ; $j < 8 ; $j++)
        {
         $table [$i][$j] = $ligne [$j] ;
        }
      }
    }
   Return $table ;
  }

/**
 * Retourne un tableau de toutes les disicplines pour plusieurs MEFs particulier
 * @param array $mefs Codes mef [0]=nbr;[i]=Code mef
 * @return array [0][0]=Nbr;[i][0]=code matiere;[i][1]=code gestion;[i][2]=libelle_long;[i][3]=libelle court;[i][4]=libelle edition;[i][5]=Id modalite
 */
 Function garennes_apb_liste_disciplines_mefs ($mefs)
  {
   Global $id_sql ;
   $requete = "SELECT code_matiere,code_gestion,libelle_long,libelle_court,libelle_edition,id_modalite FROM modalites WHERE " ;
   For ($i = 1 ; $i <= $mefs [0] ; $i++)
    {
     If ($i > 1) { $requete .= " OR " ; }
     $requete .= "code_mef='".$mefs [$i]."'" ;
    }
   $requete .= " ORDER BY libelle_long,libelle_court,libelle_edition" ;
   $resultat = SQL_commande ($requete, $id_sql) ;
   $nbr = SQL_nbr_lignes ($resultat) ;
   $table [0][0] = 0 ;
   If ($nbr > 0)
    {
     For ($i = 1 ; $i <= $nbr ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultat) ;
       $ok2 = 0 ;
       $j = 1 ;
       While ($j <= $table [0][0])
        {
         $ok1 = 0 ;
         For ($k = 0 ; $k < 2 ; $k++)
          {
           If ($table [$j][$k] == $ligne [$k]) { $ok1++ ; }
          }
         If ($ok1 != 2) { $ok2++ ; }
         $j++ ;
        }
       If ($ok2 == $table [0][0])
        {
         $table [0][0]++ ;
         For ($j = 0 ; $j < 6 ; $j++)
          {
           $table [$table [0][0]][$j] = $ligne [$j] ;
          }
        }
      }
    }
   Return $table ;
  }

 /**
 * Fournit une liste de MEF applicable dans une classe
 * @param int $id_classe Identifiant de la classe
 * @param int $millesime Annee de recherche
 * @return array [0]=Nombre; [i]=identifiant MEF
 */
 Function garennes_apb_liste_mef ($id_classe, $millesime)
  {
   Global $id_sql ;
   $resultats = SQL_commande ("SELECT DISTINCT mef FROM eleves WHERE classe='".$id_classe."' AND repere1>0 AND mef!='' AND millesime='".$millesime."'", $id_sql) ;
   $table [0] = SQL_nbr_lignes ($resultats) ;
   If ($table [0] > 0)
    {
     For ($i = 1 ; $i <= $table [0] ; $i++)
      {
       $ligne = SQL_ligne_suivante ($resultats) ;
       $table [$i] = $ligne [0] ;
      }
    }
   Return $table ;
  }

 /**
 * Fournit les codes de gestion APB pour un service prof particulier
 * @param $id_service_prof Identifiant du service prof concerne
 * @return array [0]=Id apb attribution;[1]=id service prof;[2]=Code sconet;[3]=Libelle sconet;[4]=Libelle;[5]=coefficient;[6]=Millesime
 *      ou false s'il n'existe aucun alias
 */
 Function garennes_apb_alias ($id_service_prof)
  {
   Global $id_sql ;
   $resultat = SQL_commande ("SELECT id_apb_attribution,id_service_prof,code_sconet,libelle_sconet,libelle,coefficient,millesime FROM apb_attributions WHERE id_service_prof='".$id_service_prof."' LIMIT 1", $id_sql) ;
   If (SQL_nbr_lignes ($resultat) == 1) { Return SQL_ligne_suivante ($resultat) ; }
   Return False ;
  }

 /**
 * Enleve les espaces situes a droite d'une chaine de caracteres
 * @param string $chaine Chaine a filtrer
 * @return string Chaine filtree
 */
 Function garennes_apb_filtrage_espace ($chaine)
  {
   While (SubStr ($chaine, StrLen ($chaine)-1, 1) == " ")
    { $chaine = SubStr ($chaine, 0, StrLen ($chaine)-1) ; }
   Return $chaine ;
  }

 /**
 * Verification des disciplines pour l'ensemble des classes APB actives
 * @return array Tableau des disciplines non conformes APB
 *    Format : [0][0]=Nbr de services non attribuee et a attribuer
 *             [0][1]=Nbr de services deja attribuees et a modifier eventuellement
 *             Pour les disciplines non attribuees :
 *              [i][0]=Id service prof ; [i][1]=Nom bref disc
 *              [i][2]=Nom court disc  ; [i][3]=Nom long disc
 *              [i][4]=Id prof         ; [i][5]=Id classe
 *             Pour les disciplines deja attribuees :
 *              [-i][0]=Id apb attribution ; [-i][1]=id service prof
 *              [-i][2]=Code sconet ; [-i][3]=Libelle sconet
 *              [-i][4]=Libelle ; [-i][5]=Coefficient
 *              [-i][6]=Nom bref disc ; [-i][7]=Nom court disc
 *              [-i][8]=Nom long disc ; [-i][9]=Id prof ; [-i][10]=id classe
 */
 Function garennes_apb_verification_disciplines ()
  {
   Global $mefs_classe ;
   $millesime = millesime (0) ;
   // Recherche des classes actives
   $cl = restaure_configuration ("ADMISSION_POST_BAC","CLASSES", "ACTIVES", "") ;
   $classes_actives = Explode ("|", $cl) ;
   $services_prof [0] = $classes [0] = 0 ;
   $matieres [0][0] = $matieres [0][1] = 0 ;
   For ($num_classe = 0 ; $num_classe < SizeOf ($classes_actives) ; $num_classe++)
    {
     $id_classe = $classes_actives [$num_classe] ;
     // Retrouve tous les codes mef possibles
     $mefs_classe [$id_classe] = $mefs = garennes_apb_liste_mef ($id_classe, $millesime) ;
     // Structure pedagogique de la classe
     $structure = structure_pedagogique ($id_classe, -2, $millesime) ;
     $nbr = SQL_nbr_lignes ($structure) ;
     For ($j = 1 ; $j <= $nbr ; $j++)
      {
       $discipline = SQL_ligne_suivante ($structure) ;
       $code_mef = garennes_apb_code_mef_discipline_sconet ($discipline [4], $discipline [1]) ;
       $ok = 0 ;
       If (Is_Array ($code_mef))
        {
         $k = 1 ;
         While (($k <= $code_mef [0]) And ($ok == 0))
          {
           If (In_Array ($code_mef [$k], $mefs)) { $ok = 1 ; }
           $k++ ;
          }
        }
       If ($ok == 0)
        {
         $apb_alias = garennes_apb_alias ($discipline [13]) ;
         If (!Is_Array ($apb_alias))
          {
           // Discipline non attribuee
           If (!In_Array ($discipline [13], $services_prof))
            {
             $services_prof [0]++ ;
             $services_prof [$services_prof [0]] = $discipline [13] ;
             $matieres [0][0]++ ;
             $matieres [$matieres [0][0]][0] = $discipline [13] ; // Id service prof
             $matieres [$matieres [0][0]][1] = $discipline [1] ; // Nom bref disc
             $matieres [$matieres [0][0]][2] = $discipline [2] ; // Nom court disc
             $matieres [$matieres [0][0]][3] = $discipline [3] ; // Nom long disc
             $matieres [$matieres [0][0]][4] = $discipline [11] ; // Id prof
             $matieres [$matieres [0][0]][5] = $id_classe ;
             If (!In_Array ($id_classe, $classes))
              {
               $classes [0]++ ;
               $classes [$classes [0]] = $id_classe ;
               $mefs_classe [$id_classe] = $mefs ;
              }
            }
          }
         Else
          {
           // Discipline deja attribuee
           $matieres [0][1]++ ;
           $matieres [-$matieres [0][1]][0] = $apb_alias [0] ; // Id apb attribution
           $matieres [-$matieres [0][1]][1] = $apb_alias [1] ; // Id service prof
           $matieres [-$matieres [0][1]][2] = $apb_alias [2] ; // Code sconet
           $matieres [-$matieres [0][1]][3] = $apb_alias [3] ; // Libelle sconet
           $matieres [-$matieres [0][1]][4] = $apb_alias [4] ; // Libelle
           $matieres [-$matieres [0][1]][5] = $apb_alias [5] ; // Coefficient
           $matieres [-$matieres [0][1]][6] = $discipline [1] ; // Nom bref disc
           $matieres [-$matieres [0][1]][7] = $discipline [2] ; // Nom court disc
           $matieres [-$matieres [0][1]][8] = $discipline [3] ; // Nom long disc
           $matieres [-$matieres [0][1]][9] = $discipline [11] ; // Id prof
           $matieres [-$matieres [0][1]][10] = $id_classe ; // Id classe
          }
        }
      }
    }
   Return $matieres ;
  }

 /**
 * Fonction de sauvegarde des donnees de l'annee pour apb de l'annee prochaine
 * @param array $classes Ensemble des classes a sauvegarder
 *                       [0][0] = Nombre
 *                       [i][0] = Id classe
 *                       [i][1] = Niveau
 * @param int $millesime Millesime courant
 */
 Function garennes_apb_sauvegarde_annee ($classes, $millesime)
  {
   Global $id_sql, $code_absent, $code_dispense, $code_non_rendu, $code_aucune_note, $code_pas_discipline, $note_par_defaut, $debug_SQL ;

   @Set_Time_Limit (0) ;

   // Efface toutes les tables : TEST
   $ok = SQL_commande ("TRUNCATE apb_annee_scolaire", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_classes", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_eleves", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_enseignants", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_etablissements", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_matieres", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_notes", $id_sql) ;
   $ok = SQL_commande ("TRUNCATE apb_service_notation", $id_sql) ;

   // Fin TEST

   //$debug_SQL = 1 ;
   // Traitement etablissements et classes
   For ($i = 1 ; $i <= $classes [0][0] ; $i++)
    {
     //Echo $classes [$i][0]."->".$classes [$i][1]."<br>" ;
     $requete  = "SELECT classes.id_classe,classes.nom,classes.nom_bref,types_periode.nombre,etablissements.numero,etablissements.nom,etablissements.cp,etablissements.id_etablissement " ;
     $requete .= "FROM classes,types_periode,etablissements " ;
     $requete .= "WHERE classes.id_classe='".$classes [$i][0]."' AND classes.periode=types_periode.id_type_periode AND classes.etablissement=etablissements.id_etablissement LIMIT 1" ;
     $prop_classe = SQL_commande ($requete, $id_sql) ;

     If (SQL_nbr_lignes ($prop_classe) == 1)
      {
       $prop_cl = SQL_ligne_suivante ($prop_classe) ;
       If ($prop_cl [2] != "") { $nom = $prop_cl [2] ; } ElseIf ($prop_cl [1] != "") { $nom = $prop_cl [1] ; } Else { $nom = $prop_cl [0] ; }

       $effectif_classe = effectif ($prop_cl [0]) ;

       // Insertion etablissement
       $id_etab = garennes_apb_ajout_etablissement ($prop_cl [4], $prop_cl [5], $prop_cl [6]) ;
       $nombre_colonnes_appreciations = restaure_configuration ("SYSTEME_PARAM", "SAISIE_MULTIPLE_".$prop_cl [7], "NBR_COLONNES") ;

       If ($id_etab > 0)
        {
         $code = APB_ENTETE_CLASSE.$millesime."-".$prop_cl [0] ;
         $id_pp = professeur_principal ($prop_cl [0]) ;
	 $pp = APB_ENTETE_PROF.$millesime."-".professeur_principal ($prop_cl [0]) ;
	 $classes [$i][2] = garennes_apb_ajout_classe ($id_etab, $code, $millesime, $prop_cl [1], $classes [$i][1], $pp, $prop_cl [3]) ;
	 If ($classes [$i][2] != 0)
	  {
	   // Structure pedagogique de la classe
	   $structure = structure_pedagogique ($prop_cl [0], -2, $millesime) ;
	   // Liste des eleves
	   $liste_eleves = eleves_par_id_classe ($prop_cl [0]) ;
	   $nbr = SQL_nbr_lignes ($structure) ;
	   For ($j = 1 ; $j <= $nbr ; $j++)
	    {
	     $discipline = SQL_ligne_suivante ($structure) ;
	     // Enregistrement enseignant
	     $prof = caracteristiques_utilisateur ($discipline [11]) ;
	     $code_prof = APB_ENTETE_PROF.$millesime."-".$prof [0] ;
	     $id_enseignant = garennes_apb_ajout_enseignant ($code_prof, $prof [2], $prof [3], $millesime) ;
	     // Enregistrement matiere
	     $matiere_modalites = modalites ($discipline [4], $discipline [1]) ;
             If (Is_Array ($matiere_modalites))
              {
	       $matiere [0] = APB_ENTETE_MATIERE.$millesime."-".$matiere_modalites [0] ;
	       $libelle = $discipline [1] ;
	       $code_sconet = $discipline [4] ;
	       $libelle_sconet = $discipline [1] ; // $discipline [3]
	       If (($discipline [16] > 0) And (sous_discipline_specialite ($discipline [16]) == 1)) { $matiere_specialite = "true" ; }
	       Else { $matiere_specialite = "false" ; }
	       // Nom du Groupe
	       If ($discipline [14] != 0) { $matiere [1] = nom_groupe_parid ($discipline [14]) ; } Else { $matiere [1] = "" ; }
	       $id_mat = garennes_apb_ajout_matiere ($matiere [0], $libelle, $code_sconet, $libelle_sconet, $matiere_specialite, $millesime) ;
	       If (Is_Array ($id_mat)) { $id_matiere = $id_mat [0] ; $matiere [0] = $id_mat [1] ; } Else { $id_matiere = $id_mat ; }
	       // Id structure sconet
	       $matiere [4] = $prop_cl [3] ;
	       // Service notation
	       // Determine les moyennes
	       $nbr_periodes = periode_valide ($prop_cl [0]) ;
	       For ($k = 1 ; $k <= $nbr_periodes ; $k++)
	        {
	         $code_sn = APB_ENTETE_SERVICE_NOTATION.$millesime."-".$prop_cl [0]."-".$discipline [0]."-".$k ;
	         $moy_classe = stats_disc ($prop_cl [0], $discipline [0], $k, $discipline [9], $discipline [13], $millesime) ;
	         $moyennes [0] = $moy_classe ["moy"] ;
	         $moyennes [1] = $moy_classe ["max"] ;
	         $moyennes [2] = $moy_classe ["min"] ;
	         $id_service_notation = garennes_apb_ajout_service_notation ($code_sn, $millesime, $k, $code_prof, $matiere, $moyennes, $effectif_classe) ;
	         // Traitement des eleves
                 For ($kk = 1 ; $kk <= $liste_eleves [0][0] ; $kk++)
                  {
	           $code = APB_ENTETE_ELEVE.$liste_eleves [$kk][4] ;
                   $id_eleve [$kk] = garennes_apb_ajout_eleve ($code, $liste_eleves [$kk][4], $liste_eleves [$kk][1], $liste_eleves [$kk][2], $liste_eleves [$kk][8]) ;
	           If ($id_eleve [$kk] > 0)
		    {
		     $id_apb_annee_scolaire [$kk] = garennes_apb_ajout_annee_scolaire ($id_eleve [$kk], $millesime, $classes [$i][2], $liste_eleves [$kk][9], garennes_mefsat4_champ_par_code (garennes_mef_champ_par_code ($liste_eleves [$kk][9], "mefstat4"), "libelle_court")) ;
		     // Note disciplinaire eleves
		     //$moyenne = moyenne_el ($liste_eleves [$kk][0], $prop_cl [0], $k, $discipline [0], $discipline [9], $discipline [13], 0, NOTE_MOY_ELEVE_DISC) ;
		     //$id_apb_note = garennes_apb_ajout_note ($id_apb_annee_scolaire, $k, $id_service_notation, $etat, $moyenne, $rang, $appreciation, $coefficient) ;
		    }
                  }
	         // Traitement des notes/appreciations par classe
	         $notes_app = caracteristiques_discipline ($prop_cl [0], $k, $discipline [0], $discipline [13], $discipline [9], $discipline [11], $nombre_colonnes_appreciations, $millesime) ;
	         // Fusion des appreciations multi-colonnes
	         For ($kk = 1 ; $kk <= $liste_eleves [0][0] ; $kk++)
                  {
		   $appreciations [$kk] = "" ;
		   For ($kkk = 1 ; $kkk <= $nombre_colonnes_appreciations ; $kkk++)
		    {
	             $appreciations [$kk] .= $notes_app [$kk][3+$kkk] ;
		    }
		  }
	         // Calcul du rang de chaque eleve
	         // Initialisation
	         For ($num_el = 1 ; $num_el <= $liste_eleves [0][0] ; $num_el++)
		  {
		   $notes_app [$num_el][4+$notes_app [$num_el][3]] = -1 ;
		  }
	         $note_mini = 0 ;
	         For ($rang = 1 ; $rang <= $liste_eleves [0][0] ; $rang++)
                  {
		   // Recherche de la plus petite note
		   $num_el = 1 ;
		   While (($notes_app [$num_el][4+$notes_app [$num_el][3]] != -1) And ($num_el <= $liste_eleves [0][0]))
		    {
		     $num_el++ ;
		    }
		   $pos_plus_grand = $num_el ;
		   $plus_grand = $notes_app [$pos_plus_grand][2] ;
		   For ($kk = $num_el+1 ; $kk <= $liste_eleves [0][0] ; $kk++)
		    {
		     If (($notes_app [$kk][4+$notes_app [$kk][3]] == -1) And ($notes_app [$kk][2] > $plus_grand))
		      {
		       $pos_plus_grand = $kk ;
		       $plus_grand = $notes_app [$pos_plus_grand][2] ;
		      }
		    }
		   // Affectation du rang
		   $notes_app [$pos_plus_grand][4+$notes_app [$pos_plus_grand][3]] = $rang ;
		  }
	         // Coefficient
	         $coefficient = $discipline [10] ;
	         // Ajout des notes
	         For ($num_el = 1 ; $num_el <= $liste_eleves [0][0] ; $num_el++)
		  {
		   // Modalite d'une discipline (S,O,F,N)
	           $modalite = garennes_apb_modalite_discipline ($liste_eleves [$num_el][9], $discipline [4]) ;
		   // Etat de la note (S,D,N)
		   Switch ($notes_app [$num_el][2])
		    {
		     Case $code_absent         : $etat = "N" ; Break ;
		     Case $code_dispense       : $etat = "D" ; Break ;
		     Case $code_non_rendu      : $etat = "N" ; Break ;
		     Case $code_aucune_note    : $etat = "N" ; Break ;
		     Case $code_pas_discipline : $etat = "N" ; Break ;
		                       Default : $etat = "S" ; Break ;
                    }
		   //echo $notes_app [$num_el][2]."->".$notes_app [$num_el][4+$notes_app [$num_el][3]]."<br>" ;
		   $id_apb_note = garennes_apb_ajout_note ($id_apb_annee_scolaire [$num_el], $k, $id_service_notation, $etat, $modalite, $notes_app [$num_el][2], $notes_app [$num_el][4+$notes_app [$num_el][3]], $appreciations [$num_el], $coefficient) ;
		  }
	        }
	      }
	     Else
	      {
	       // Modalites non correcte
	      }
	    }
	   $ok = 1 ;
	  }
	}
      }
    }
   // Suite si au moins une classe a ete traitee correctement
   If ($ok == 1)
    {

    }
  }

 /**
 * Retourne l'ensemble des moyennes (NC et C) sur une classe entre 2 periodes
 * @param int $id_classe Identifiant de la classe
 * @param int $min_periode Numero de la periode minimale
 * @param int $max_periode Numero de la periode maximale
 * @param int $millesime Annee courante
 * @return array Ensemble des moyennes (voir fonction /include/moyennes.php -> calcul_moyennes)
 */
 Function garennes_apb_moyennes ($id_classe, $min_periode, $max_periode, $millesime)
  {
   Global $id_sql ;
   // Gestion
   $resultat = SQL_commande ("SELECT e.moyenne,e.moyenne_periode FROM etablissements e,classes c WHERE c.id_classe='".$id_classe."' AND c.etablissement=e.id_etablissement LIMIT 1", $id_sql) ;
   $gestion = SQL_tableau_associatif ($resultat, "") ;

   $gestion ["max"] = 20 ; // Note sur
   $format_arrondi = 1 ; // 1 decimale
   $nbr_periodes = $max_periode-$min_periode+1 ;
   $espace = " " ; // Vrai espace
   $mode = 0 ; // Pas de HTML
   $titre = 0 ; // Pas de HTML

   // Affiche entete
   $resultats = SQL_commande ("SELECT t.nom_periode,t.nombre,c.num_periode FROM classes c,types_periode t WHERE t.id_type_periode=c.periode AND c.id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   $nom_periode = SQL_ligne_suivante ($resultats) ;

   // Moyenne coefficientee ?
   $cf = SQL_commande ("SELECT coefficient FROM classes WHERE id_classe='".$id_classe."' LIMIT 1", $id_sql) ;
   $cof = SQL_ligne_suivante ($cf) ;
   $aff_coeff = $cof [0] ;

   // Determine le nombre et le nom des groupements de disciplines
   $groupe_disc = groupement_toutes_disciplines ($id_classe, $millesime) ;
   If ($groupe_disc [0][0] > 0) { $tdisc = determine_disciplines ($id_classe, $groupe_disc, $millesime) ; } Else { $tdisc ["general"]["nombre_disc"] = 0 ; }
   $nombre_disciplines = $tdisc ["general"]["nombre_disc"] ;

   $aff_ligne = initialise_moyennes ($id_classe, $nombre_disciplines, $min_periode, $max_periode, $aff_coeff, $titre) ;

   // Recherche discipline par discipline les moyennes
   $aff_ligne = attribution_moyennes ($aff_ligne, NOTE_MOY_ELEVE_DISC, $min_periode, $max_periode, $tdisc, $nom_periode, $format_arrondi, $mode, $espace) ;

   // Calcul de toutes les moyennes NORMALES
   If (($groupe_disc [0][0] == 1) And ($groupe_disc [1][0] == -1)) { $moy_periode = 0 ; } Else { $moy_periode = $gestion ["moyenne_periode"] ; }
   $moyennes = calcul_moyennes ($aff_ligne, $min_periode, $max_periode, $groupe_disc, $tdisc, $moy_periode, $gestion ["moyenne"], $gestion ["max"]) ;

   Return $moyennes ;
  }

 /**
 * Insertion d'un etablisement
 * @param string $rne Numero RNE de 8 caracteres
 * @param string $nom Nom de l'etablissement de 70 caracteres
 * @param string $cp Code postal de 5 chiffres
 * @return int Identifiant du nouvel ajout ou de l'etablissement deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_etablissement ($rne, $nom, $cp)
  {
   Global $id_sql ;
   $id_etab = 0 ;
   $requete = "SELECT id_apb_etablissement FROM apb_etablissements WHERE rne='".$rne."' AND cp='".$cp."' LIMIT 1" ;
   $etab = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($etab) == 0)
    {
     $requete = "INSERT INTO apb_etablissements (rne,nom,cp) VALUES ('".$rne."','".$nom."','".$cp."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_etablissement FROM apb_etablissements WHERE rne='".$rne."' AND cp='".$cp."' LIMIT 1" ;
       $etab = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($etab) == 1)
        {
         $et = SQL_ligne_suivante ($etab) ;
         $id_etab = $et [0] ;
        }
      }
    }
   Else
    {
     $et = SQL_ligne_suivante ($etab) ;
     $id_etab = $et [0] ;
    }
   Return $id_etab ;
  }

 /**
 * Insertion d'une classe
 * @param string $id_etab Identifiant de l'etablissement
 * @param string $code Code unique de la classe (30 caracteres max)
 * @param string $nom Nom de la classe
 * @param int $niveau Niveau de la classe
 * @param string $pp Professeur principal (30 caracteres max)
 * @param int $decoupage Decoupage des bulletins
 * @param int $annee Annee d'existance de la classe
 * @param string $id_structure_sconet Code structure dans sconet (8 caracteres max)
 * @return int Identifiant du nouvel ajout ou de la classe deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_classe ($id_etab, $code, $annee, $nom, $niveau, $pp, $decoupage, $id_structure_sconet)
  {
   Global $id_sql ;
   $id_classe = 0 ;
   $requete = "SELECT id_apb_classe FROM apb_classes WHERE id_apb_etablissement='".$id_etab."' AND code='".$code."' AND annee='".$annee."' AND niveau='".$niveau."' AND decoupage='".$decoupage."' LIMIT 1" ;
   $classe = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($classe) == 0)
    {
     $requete = "INSERT INTO apb_classes (id_apb_etablissement,code,annee,nom,niveau,professeur_principal,decoupage,id_structure_sconet) VALUES " ;
     $requete .= "('".$id_etab."','".$code."','".$annee."','".$nom."','".$niveau."','".$pp."','".$decoupage."','".$id_structure_sconet."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_classe FROM apb_classes WHERE id_apb_etablissement='".$id_etab."' AND code='".$code."' AND annee='".$annee."' AND niveau='".$niveau."' AND decoupage='".$decoupage."' LIMIT 1" ;
       $classe = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($classe) == 1)
        {
         $cl = SQL_ligne_suivante ($classe) ;
         $id_classe = $cl [0] ;
        }
      }
    }
   Else
    {
     $cl = SQL_ligne_suivante ($classe) ;
     $id_classe = $cl [0] ;
     $requete = "UPDATE apb_classes SET id_structure_sconet='".$id_structure_sconet."' WHERE id_apb_classe='".$id_classe."' LIMIT 1" ; 
     $ok = SQL_commande ($requete, $id_sql) ;
    }
   Return $id_classe ;
  }

 /**
 * Insertion d'un enseignant
 * @param string $id_etab Identifiant de l'etablissement
 * @param string $code Code unique de l'enseignant (30 caracteres max)
 * @param string $nom Nom de l'enseignant
 * @param string $prenom Prenom de l'enseignant
 * @param int $millesime Annee courante
 * @return int Identifiant du nouvel ajout ou du professeur deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_enseignant ($code, $nom, $prenom, $millesime)
  {
   Global $id_sql ;
   $id_enseignant = 0 ;
   $requete = "SELECT id_apb_enseignant FROM apb_enseignants WHERE code='".$code."' AND nom='".$nom."' AND prenom='".$prenom."' AND millesime='".$millesime."' LIMIT 1" ;
   $enseignant = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($enseignant) == 0)
    {
     $requete = "INSERT INTO apb_enseignants (code,nom,prenom,millesime) VALUES ('".$code."','".$nom."','".$prenom."','".$millesime."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_enseignant FROM apb_enseignants WHERE code='".$code."' AND nom='".$nom."' AND prenom='".$prenom."' AND millesime='".$millesime."' LIMIT 1" ;
       $enseignant = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($eleve) == 1)
        {
         $ens = SQL_ligne_suivante ($enseignant) ;
         $id_enseignant = $ens [0] ;
        }
      }
    }
   Else
    {
     $ens = SQL_ligne_suivante ($enseignant) ;
     $id_enseignant = $ens [0] ;
    }
   Return $id_enseignant ;
  }

 /**
 * Insertion d'un eleve
 * @param string $id_etab Identifiant de l'etablissement
 * @param string $code Code unique de l'eleve (30 caracteres max)
 * @param string $ine Numero INE unique de l'eleve
 * @param string $nom Nom de l'eleve
 * @param string $prenom Prenom de l'eleve
 * @param string $date_naissance Date de naissance de l'eleve
 * @return int Identifiant du nouvel ajout ou de l'eleve deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_eleve ($code, $ine, $nom, $prenom, $date_naissance)
  {
   Global $id_sql ;
   $id_eleve = 0 ;
   $requete = "SELECT id_apb_eleve FROM apb_eleves WHERE code='".$code."' AND ine='".$ine."' AND date_naissance='".$date_naissance."' LIMIT 1" ;
   $eleve = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($eleve) == 0)
    {
     $requete = "INSERT INTO apb_eleves (code,ine,nom,prenom,date_naissance) VALUES " ;
     $requete .= "('".$code."','".$ine."','".$nom."','".$prenom."','".$date_naissance."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_eleve FROM apb_eleves WHERE code='".$code."' AND ine='".$ine."' AND date_naissance='".$date_naissance."' LIMIT 1" ;
       $eleve = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($eleve) == 1)
        {
         $el = SQL_ligne_suivante ($eleve) ;
         $id_eleve = $el [0] ;
        }
      }
    }
   Else
    {
     $el = SQL_ligne_suivante ($eleve) ;
     $id_eleve = $el [0] ;
    }
   Return $id_eleve ;
  }

 /**
 * Insertion d'une annee scolaire pour un eleve
 * @param int $id_eleve Identifiant de l'eleve
 * @param int $annee Annee courante
 * @param int $id_classe Identifiant de la classe
 * @param string $code_mef Code numerique du MEF de l'eleve durant l'annee (11 chiffres)
 * @param string $libelle_mef Libelle court? du MEF (60 caracteres max)
 * @return int Identifiant du nouvel ajout ou de l'annee scolaire deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_annee_scolaire ($id_eleve, $annee, $id_classe, $code_mef, $libelle_mef)
  {
   Global $id_sql ;
   $id_annee_scolaire = 0 ;
   $requete = "SELECT id_apb_annee_scolaire FROM apb_annee_scolaire WHERE id_apb_eleve='".$id_eleve."' AND annee='".$annee."' AND id_apb_classe='".$id_classe."' AND code_mef='".$code_mef."' LIMIT 1" ;
   $annee_scolaire = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($annee_scolaire) == 0)
    {
     $requete = "INSERT INTO apb_annee_scolaire (id_apb_eleve,annee,id_apb_classe,code_mef,libelle_mef) VALUES " ;
     $requete .= "('".$id_eleve."','".$annee."','".$id_classe."','".$code_mef."','".$libelle_mef."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_annee_scolaire FROM apb_annee_scolaire WHERE id_apb_eleve='".$id_eleve."' AND annee='".$annee."' AND id_apb_classe='".$id_classe."' AND code_mef='".$code_mef."' LIMIT 1" ;
       $annee_scolaire = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($annee_scolaire) == 1)
        {
         $as = SQL_ligne_suivante ($annee_scolaire) ;
         $id_annee_scolaire = $as [0] ;
        }
      }
    }
   Else
    {
     $as = SQL_ligne_suivante ($annee_scolaire) ;
     $id_annee_scolaire = $as [0] ;
    }
   Return $id_annee_scolaire ;
  }

 /**
 * Insertion d'une matiere
 * @param string $code Code unique de la matiere (30 caracteres max)
 * @param string $libelle_sconet Libelle bref de la matiere (5 caracteres max)
 * @param string $code_sconet Code de la matiere dans sconet
 * @param string $libelle Libelle bref de la matiere
 * @param string $matiere_specialite Indique une specialite (true/false)
 * @param int $millesime Annee courante
 * @return int Identifiant du nouvel ajout ou de la matiere deja ajoutee sinon 0 (si probleme)
 * @return array [0]=Identiant matiere;[1]=Code matiere
 */
 Function garennes_apb_ajout_matiere ($code, $libelle_sconet, $code_sconet, $libelle, $matiere_specialite, $millesime)
  {
   Global $id_sql ;
   $id_matiere = 0 ;
   $requete = "SELECT id_apb_matiere,code FROM apb_matieres WHERE code_sconet='".$code_sconet."' AND millesime='".$millesime."' LIMIT 1" ;
   $matiere = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($matiere) == 0)
    {
     $requete = "INSERT INTO apb_matieres (code,libelle_sconet,code_sconet,libelle,matiere_specialite,millesime) VALUES ('".$code."','".$libelle_sconet."','".$code_sconet."','".$libelle."','".$matiere_specialite."','".$millesime."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_matiere FROM apb_matieres WHERE code_sconet='".$code_sconet."' AND millesime='".$millesime."' LIMIT 1" ;
       $matiere = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($matiere) == 1)
        {
         $mat = SQL_ligne_suivante ($matiere) ;
         $id_matiere = $mat [0] ;
        }
      }
    }
   Else
    {
     $mat = SQL_ligne_suivante ($matiere) ;
     $id_matiere = Array ($mat [0],$mat [1]) ;
    }
   Return $id_matiere ;
  }

 /**
 * Insertion d'un service notation
 * @param string $code Identifiant unique du service notation (30 caracteres max)
 * @param int $annee Annee concernee
 * @param int $trimestre Numero du trimestre ou semestre concerne
 * @param string $code_enseignant Identifiant de l'enseignant qui a donne la note (30 caracteres max)
 * @param array $matiere [0]=Code matiere (30 caracteres max);[1]=Nom groupe;[2]=Id structure sconet (8 caracteres max)
 * @param array $moyennes [0]=Moyenne classe;[1]=Moyenne haute;[2]=Moyenne basse
 * @param int $effectif Effectif du groupe ou classe
 * @return int Identifiant du nouvel ajout ou du service notation deja ajoute sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_service_notation ($code, $annee, $trimestre, $code_enseignant, $matiere, $moyennes, $effectif)
  {
   Global $id_sql ;
   $id_sn = 0 ;
   $requete = "SELECT id_apb_service_notation FROM apb_service_notation WHERE code='".$code."' AND annee='".$annee."' AND trimestre='".$trimestre."' " ;
   $requete .= "AND code_enseignant='".$code_enseignant."' AND code_matiere='".$matiere [0]."' AND nom_groupe='".$matiere [1]."' AND id_structure_sconet='".$matiere [2]."' LIMIT 1" ;
   $serv = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($serv) == 0)
    {
     $requete = "INSERT INTO apb_service_notation (code,annee,trimestre,code_enseignant,code_matiere,nom_groupe,id_structure_sconet,moyenne_classe,moyenne_haute,moyenne_basse,effectif) VALUES " ;
     $requete .= "('".$code."','".$annee."','".$trimestre."','".$code_enseignant."','".$matiere [0]."','".$matiere [1]."','".$matiere [2]."','".$moyennes [0]."','".$moyennes [1]."','".$moyennes [2]."','".$effectif."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_service_notation FROM apb_service_notation WHERE code='".$code."' AND annee='".$annee."' AND trimestre='".$trimestre."' " ;
       $requete .= "AND code_enseignant='".$code_enseignant."' AND code_matiere='".$matiere [0]."' AND nom_groupe='".$matiere [1]."' AND id_structure_sconet='".$matiere [2]."' LIMIT 1" ;
       $serv = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($serv) == 1)
        {
         $sn = SQL_ligne_suivante ($serv) ;
         $id_sn = $sn [0] ;
        }
      }
    }
   Else
    {
     $sn = SQL_ligne_suivante ($serv) ;
     $id_sn = $sn [0] ;
    }
   Return $id_sn ;
  }

 /**
 * Insertion d'une note
 * @param int $id_apb_annee_scolaire Identifiant de l'annee scolaire
 * @param int $trimestre Numero du trimestre/semestre
 * @param int $id_apb_service_notation Identifiant du service notation
 * @param string $etat Etat (A/D/N/S)
 * @param string $modalite_election Modalite discipline (O,S,F,N)
 * @param string $moyenne Moyenne eleve
 * @param string $rang Rang eleve
 * @param string $appreciation Appreciation enseignant
 * @param string $coefficient Coefficient discipline
 * @return int Identifiant du nouvel ajout ou de la note deja ajoutee sinon 0 (si probleme)
 */
 Function garennes_apb_ajout_note ($id_apb_annee_scolaire, $trimestre, $id_apb_service_notation, $etat, $modalite_election, $moyenne, $rang, $appreciation, $coefficient)
  {
   Global $id_sql ;
   $id_sn = 0 ;
   $requete = "SELECT id_apb_note FROM apb_notes WHERE id_apb_annee_scolaire='".$id_apb_annee_scolaire."' AND trimestre='".$trimestre."' AND id_apb_service_notation='".$id_apb_service_notation."' LIMIT 1" ;
   $note = SQL_commande ($requete, $id_sql) ;
   If (SQL_nbr_lignes ($note) == 0)
    {
     $requete = "INSERT INTO apb_notes (id_apb_annee_scolaire,trimestre,id_apb_service_notation,etat,modalite_election,moyenne,rang,appreciation,coefficient) VALUES " ;
     $requete .= "('".$id_apb_annee_scolaire."','".$trimestre."','".$id_apb_service_notation."','".$etat."','".$modalite_election."','".$moyenne."','".$rang."','".$appreciation."','".$coefficient."')" ;
     $ok = SQL_commande ($requete, $id_sql) ;
     If ($ok)
      {
       $requete = "SELECT id_apb_note FROM apb_notes WHERE id_apb_annee_scolaire='".$id_apb_annee_scolaire."' AND trimestre='".$trimestre."' AND id_apb_service_notation='".$id_apb_service_notation."' LIMIT 1" ;
       $note = SQL_commande ($requete, $id_sql) ;
       If (SQL_nbr_lignes ($note) == 1)
        {
         $nt = SQL_ligne_suivante ($note) ;
         $id_note = $nt [0] ;
        }
      }
    }
   Else
    {
     $nt = SQL_ligne_suivante ($note) ;
     $id_note = $nt [0] ;
     $requete = "UPDATE apb_notes SET etat='".$etat."',modalite_election='".$modalite_election."',moyenne='".$moyenne."',rang='".$rang."',appreciation='".$appreciation."',coefficient='".$coefficient."' WHERE id_apb_note='".$id_note."' LIMIT 1" ;
     $ok = SQL_commande ($requete, $id_sql) ;
    }
   Return $id_note ;
  }
?>